package cn.huaqingcheng.tool.crypto.codec;

import org.jetbrains.annotations.NotNull;

import java.nio.charset.StandardCharsets;
import java.util.Base64;

/**
 * Base64编码解码
 */
@SuppressWarnings("unused")
public interface Base64Tool {

    /**
     * BASE64编码 实例是线程安全的
     */
    Base64.Encoder E = Base64.getEncoder();

    /**
     * BASE64解码 实例是线程安全的
     */
    Base64.Decoder D = Base64.getDecoder();

    /**
     * <h3>编码为字符串: String -> String</h3>
     */
    static @NotNull String encodeToStr(@NotNull String input) {
        return encodeToStr(input.getBytes(StandardCharsets.UTF_8));
    }

    /**
     * <h3>编码为字符串: 字节 -> String</h3>
     */
    static @NotNull String encodeToStr(byte[] input) {
        byte[] encode = E.encode(input);
        return new String(encode, StandardCharsets.UTF_8);
    }

    /**
     * <h3>编码: String -> 字节</h3>
     * 字节 -> 字节 的基础操作: {@link Base64.Encoder#encode(byte[])}
     */
    static byte[] encode(@NotNull String encode) {
        return E.encode(encode.getBytes(StandardCharsets.UTF_8));
    }

    /**
     * <h3>解码并转为字符串: String -> String</h3>
     */
    static @NotNull String decodeToStr(@NotNull String encode) {
        return decodeToStr(encode.getBytes(StandardCharsets.UTF_8));
    }

    /**
     * <h3>解码并转为字符串: 字节 -> String</h3>
     */
    static @NotNull String decodeToStr(byte[] encode) {
        byte[] decode = D.decode(encode);
        return new String(decode, StandardCharsets.UTF_8);
    }

    /**
     * <h3>解码: String -> 字节</h3>
     * 字节 -> 字节 : {@link Base64.Decoder#decode(byte[])}
     */
    static byte[] decode(@NotNull String encode) {
        return D.decode(encode.getBytes(StandardCharsets.UTF_8));
    }

}
